# -*- coding: utf-8 -*-

from numpy import *
import matplotlib.pyplot as plot
from matplotlib.figure import SubplotParams
import os, sys

class Population:
    '''
    Klasse Population zur Simulation der Bevölkerungsanzahl, mithilfe
    einer Geburten- und Sterberate
    '''
    
    def __init__(self, popDev, birthRate, deathRate, timeStep, timeRange):
        """
        Methode zur Initialisierung der Attribute popDev, birthRate, deathRate,
        timeStep und timeRange zur Beschreibung der Bevölkerungsentwicklung
        """
        self.popDev = [popDev]
        self.birthRate = birthRate
        self.deathRate = deathRate
        self.timeStep = timeStep
        self.timeRange = timeRange
        print popDev, birthRate, deathRate, timeStep, timeRange


    def birth(self, popDev):
        """
        Methode zur Berechnung der Anzahl der Geburten, abhänging von der
        Geburtenrate
        """
        return popDev*self.birthRate*self.timeStep        
    

    def death(self, popDev):
        """
        Methode zur Berechnung der Anzahl der Todesfälle, abhängig von der
        Sterberate
        """
        return popDev*self.deathRate*self.timeStep

   
    def ausgabe(self):
        """
        Methode ausgabe zur Ausgabe der Bevölkerungsentwicklung zu jedem Zeitstand
        an die Konsole
        """
        i = 0
        while i < self.timeRange/self.timeStep:
            print 'Jahr = ', i*self.timeStep, "Bevölkerungsanzahl: ", self.popDev[i]
            print "Geburten: ", self.birth(self.popDev[i]), "Sterbefälle: ", self.death(self.popDev[i])
            i = i+1


    def treffen(self, ziel):
        """
        Methode treffen zur Berechung des Treffens zweier Populationen mit einer bestimmten Wahrscheinlichkeit
        """
        treffen =((sum(i*j for i,j in zip(self.popDev,ziel.popDev)))/20)*self.timeStep
        print treffen
        return treffen  
        
    def populationSim(self):
        """
        Methode zur Simulation der Bevölkerungsentwicklung
        """
        i = 0
        birth = []
        death = []
        while i < self.timeRange/self.timeStep:
            birth.append(self.birth(self.popDev[i]))
            death.append(self.death(self.popDev[i]))
            self.popDev.append(self.popDev[i] + birth[i] - death[i])
            i = i+1
        return self.popDev, birth, death


    def visualisierung(self, popDev):
        """
        Methode visualisierung zur Visualisierung der zeitlichen Dynamik
        der Stock- und Flowvariablen der Klasse Population
        """
        fig = plot.figure(subplotpars = SubplotParams(left=None,
        right = None, bottom=None, top=None, wspace = 0.4, hspace = 0.4))        
        ax1 = fig.add_subplot(211)
        data = self.popDev
        ax1.plot(self.popDev)
        plot.ylabel('Bevoelkerung')
        ax2 = fig.add_subplot(223)
        ax2.plot(self.populationSim()[1])
        plot.ylabel('Geburten')
        ax3 = fig.add_subplot(224)
        ax3.plot(self.populationSim()[2])
        plot.ylabel('Sterbefaelle')
        plot.show()

"""
Testumgebung zum Aufruf der Methoden
"""
myPop = Population(20, 0.2, 0.1, 0.125, 100)
myPopSim = myPop.populationSim()
#myPop.ausgabe()
#myPop.visualisierung(myPopSim)







        
